home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Apple II Magazines (DO)
/
Nibble Volume 09, No. 07 (1988-07)(MicroSPARC)(Side B).zip
/
Nibble Volume 09, No. 07 (1988-07)(MicroSPARC)(Side B).do
/
PYRAMID.ML.S
< prev
next >
Wrap
Text File
|
1996-12-24
|
9KB
|
325 lines
********************************
* *
* The Pyramid.ML *
* *
* by Jim Lazar *
* *
* *
* *
* *
********************************
* Merlin Pro Assembler (128k)
DATE
* Equates
BASADR = $EB ;Hi-res screen base address
XBYTE = $ED ;X byte number in screen line
YLINE = $EE ;Y line number
CARD = $EF ;Card number
ADR1 = $F9 ;General addresses
ADR2 = $FB
YCNT = $FD ;Count values
XCNT = $FE
HIRES = $2000 ;Start of hi-res page
SPEAKER = $C030 ;Click speaker address
WAIT = $FCA8 ;Monitor wait routine
* Data Addresses
YSCRNL = $0A00 ;Y low address table
YSCRNH = $0AC0 ;Y high address table
TITDATA = $0B80 ;Title data
SUITDATA = $0E00 ;Card middle (suits) data
TOPDATA = $0FE0 ;Card top (numbers) data
BOTDATA = $11E8 ;Card bottom (numbers) data
BACKDATA = $13F0 ;Card back data
ORG $800 ;Start at $800
DISCARD JMP CARDDIS ;Branch addresses
DISBACK JMP BACKDIS
DISTIT JMP CLRTIT
DISBLANK JMP BLANKDIS
* Sound Routine
DURATION HEX 00 ;Duration of tone
FREQ HEX 00 ;Frequency of tone
SOUND LDY FREQ ;Load frequency count
:NEXT LDX FREQ
LDA #$04
JSR WAIT ;Wait a bit
LDA SPEAKER ;Click speaker
:FREQSEL INX
BNE :FREQSEL
DEY
BNE :NEXT
DEC DURATION ;Repeat for duration count
BNE SOUND
RTS
* Clear Screen & Display Title
CLRTIT LDA #>HIRES ;Set starting address of
STA BASADR+1 ; hi-res page
LDA #HIRES
STA BASADR
:NEXT LDA #$80 ;Set all hi-res screen
LDY #0 ; bytes to $80 (all high bits
STA (BASADR),Y ; on)
INC BASADR ;Increment address
BNE :NEXT
INC BASADR+1
LDA BASADR+1 ;If high byte is $40 then
CMP #$40 ; done
BCC :NEXT
LDA #>TITDATA ;Set starting address of
STA ADR1+1 ; title data
LDA #TITDATA
STA ADR1
LDX #0
:LINE TXA ;Start at top of screen
TAY
JSR SETBASE
LDY #0
:COPY LDA (ADR1),Y ;Copy title data to
ORA #$80 ; screen
STA (BASADR),Y
INY
CPY #40 ;Last byte in line?
BCC :COPY
CLC
LDA ADR1 ;Add 40 to title address
ADC #40 ; to get next line of data
STA ADR1
LDA ADR1+1
ADC #0
STA ADR1+1
INX ;Increment X (line number)
CPX #16 ;Check if 16
BCC :LINE
RTS
* Display Card on Screen *
CARDDIS LDA #0 ;Set line count to 0
STA YCNT
LDA CARD ;Get card number
AND #$0F ;Chop Suit number off
TAX
DEX
LDA #>TOPDATA ;Set starting addresses of
STA ADR1+1 ;top and bottom data
LDA #TOPDATA
STA ADR1
LDA #>BOTDATA
STA ADR2+1
LDA #BOTDATA
STA ADR2
CPX #0 ;If X is zero address is
BEQ TOPCARD ; allready correct
:NEXT LDA ADR1 ;For each card number add
CLC ; $28 to addresses to get
ADC #$28 ; position of number data
STA ADR1 ; (top and bottom of card)
BCC :SKIP1
INC ADR1+1
:SKIP1 LDA ADR2 ;Do it for both addresses
CLC
ADC #$28
STA ADR2
BCC :SKIP2
INC ADR2+1
:SKIP2 DEX ;Decrememt card number
BNE :NEXT
TOPCARD LDY YLINE ;Set screen base address
JSR SETBASE
LDA #0
STA XCNT ;Set count
:NEXT LDY #0
LDA (ADR1),Y ;Load card top data
PHA
LDA XBYTE ;Add X byte to count to
CLC ; get screen byte number
ADC XCNT
TAY
PLA
STA (BASADR),Y ;Save on screen
INC ADR1 ;Increment address
BNE :SKIP
INC ADR1+1
:SKIP INC XCNT ;Increment counter and check
LDA XCNT ; if done with this line
CMP #4
BCC :NEXT
INC YLINE ;Increment line number and
INC YCNT ; line counter
LDA YCNT
CMP #10 ;Check if done displaying top
BCC TOPCARD ; of card
LDA #>SUITDATA ;Set starting address of
STA ADR1+1 ; suit data (middle of card)
LDA #SUITDATA
STA ADR1
LDA CARD ;Load card number
AND #$F0 ;Get upper nibble (suit number)
LSR
LSR
LSR
LSR
TAX
CPX #3 ;If card is a spade or club
BCC :MULT ; then skip
LDA XBYTE ;Check if even or odd column
LSR ; for diamonds and hearts to
BCC :MULT ; determine the data to use
INX ; so orange hearts and diamonds
INX ; are not color shifted
:MULT DEX
BEQ MIDCARD
LDA ADR1 ;For each suit number add 80 to
CLC ; suit address to get data
ADC #80 ; position
STA ADR1
BCC :MULT
INC ADR1+1
BNE :MULT
MIDCARD LDY YLINE ;Set screen base address
JSR SETBASE
LDA #0
STA XCNT ;Set byte count
:NEXT LDY #0
LDA (ADR1),Y ;Load card data byte
PHA
LDA XBYTE ;Add X byte to count to
CLC ; get screen byte number
ADC XCNT
TAY
PLA
STA (BASADR),Y ;Save card data byte on screen
INC ADR1 ;Increment card data address
BNE :SKIP
INC ADR1+1
:SKIP INC XCNT ;Increment byte counter
LDA XCNT ;Check if end of line
CMP #4
BCC :NEXT
INC YLINE ;Increment line number and
INC YCNT ; counter
LDA YCNT ;Check if last line of
CMP #30 ; card middle
BCC MIDCARD
BOTCARD LDY YLINE ;Set base address
JSR SETBASE
LDA #0
STA XCNT ;Set count
:NEXT LDY #0
LDA (ADR2),Y ;Load card bottom data
PHA
LDA XBYTE ;Add X byte to count to
CLC ; get screen byte number
ADC XCNT
TAY
PLA
STA (BASADR),Y ;Save on screen
INC ADR2 ;Increment address
BNE :SKIP
INC ADR2+1
:SKIP INC XCNT ;Increment counter and check
LDA XCNT
CMP #4
BCC :NEXT
INC YLINE ;Increment line number and
INC YCNT ; counter
LDA YCNT
CMP #40
BCC BOTCARD
RTS
* Display Blank Card *
BLANKDIS LDA #0
STA YCNT
:DISPLAY LDY YLINE ;Set base address
JSR SETBASE
LDA #0
STA XCNT ;Set count
:NEXT LDA XBYTE ;Add X byte to count to
CLC ; get screen byte number
ADC XCNT
TAY
LDA #$80 ;Load blank byte
STA (BASADR),Y ;Save on screen
INC XCNT ;Increment counter and check
LDA XCNT
CMP #4
BCC :NEXT
INC YLINE ;Increment line number and
INC YCNT ; counter
LDA YCNT
CMP #40
BCC :DISPLAY
RTS
* Display Back of Card *
BACKDIS LDA #0
STA YCNT
LDA #>BACKDATA ;Copy address
STA ADR1+1
LDA #BACKDATA
STA ADR1
LDA XBYTE ;If column is even use
LSR ; second back data
BCS :DISPLAY
LDA ADR1 ;Add $A0 to address to
CLC ; get pointer to point to
ADC #$A0 ; second back data (even)
STA ADR1
BCC :DISPLAY
INC ADR1+1
:DISPLAY LDY YLINE ;Set base address
JSR SETBASE
LDA #0
STA XCNT ;Set count
:NEXT LDY #0
LDA (ADR1),Y ;Load card back data
PHA
LDA XBYTE ;Add X byte to count to
CLC ; get screen byte number
ADC XCNT
TAY
PLA
STA (BASADR),Y ;Save on screen
INC ADR1 ;Increment address
BNE :SKIP
INC ADR1+1
:SKIP INC XCNT ;Increment counter and check
LDA XCNT
CMP #4
BCC :NEXT
INC YLINE ;Increment line number and
INC YCNT ; counter
LDA YCNT
CMP #40
BCC :DISPLAY
RTS
* Set Screen Base Address *
SETBASE LDA YSCRNL,Y ;Load and save screen
STA BASADR ; base address
LDA YSCRNH,Y
STA BASADR+1
RTS
DS \
PAGE